package com.hotel.controle;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.http.HttpServletRequest;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;

import com.hotel.dao.FuncionarioDAO;
import com.hotel.entidade.Funcionario;
import com.hotel.util.HibernateUtil;

@ManagedBean(name = "funcionarioBean")
@SessionScoped
public class FuncionarioControle {

	private FuncionarioDAO funcionarioDAO;
	private Session session;
	private Funcionario funcionarioLogado;
	private Funcionario funcionario;
	@SuppressWarnings("rawtypes")
	private DataModel listaFuncionarios;
	private String keyword = "";
	private String login;
	private String senha;

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public void criaFuncionario() {
		funcionario = new Funcionario();
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}
	
	public Funcionario getFuncionarioLogado() {
		return funcionarioLogado;
	}

	public void setFuncionarioLogado(Funcionario funcionarioLogado) {
		this.funcionarioLogado = funcionarioLogado;
	}
	
	public String getKeyword() {
		return keyword;
	}

	public void setKeyword(String keyword) {
		this.keyword = keyword;
	}

	@SuppressWarnings("rawtypes")
	public DataModel getListaFuncionarios() {
		if (this.listaFuncionarios == null) {
			listarFuncionarios();
		}
		return listaFuncionarios;
	}

	public void listarFuncionarios() {
		session = HibernateUtil.configureSessionFactory().openSession();
		funcionarioDAO = new FuncionarioDAO(session);
		List<Funcionario> lista = funcionarioDAO.listaTodos();
		listaFuncionarios = new ListDataModel<Funcionario>(lista);
	}

	public String preparaInserirFuncionario() {
		funcionario = new Funcionario();
		return "/funcionarios/inserirFuncionario";
	}

	public String inserirFuncionario() {
		session = HibernateUtil.configureSessionFactory().openSession();
		funcionarioDAO = new FuncionarioDAO(session);
		try{
			funcionarioDAO.insere(funcionario);
		} catch (Exception e) {
			e.printStackTrace();
		}
		listarFuncionarios();
		return "/funcionarios/buscaFuncionario";
	}

	public String preparaAlterarFuncionario() {
		funcionario = (Funcionario) (listaFuncionarios.getRowData());
		return "/funcionarios/alterarFuncionario";
	}

	public String alterarFuncionario() {
		funcionarioDAO = new FuncionarioDAO(session);
		try{
			funcionarioDAO.atualisa(funcionario);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "/funcionarios/buscaFuncionario";
	}

	public String excluirFuncionario() {
		Funcionario func = (Funcionario) (listaFuncionarios.getRowData());
		funcionarioDAO = new FuncionarioDAO(session);
		try{
			funcionarioDAO.deleta(func);
		} catch(Exception e){
			e.printStackTrace();
		}
		listarFuncionarios();
		return "/funcionarios/buscaFuncionario";
	}

	public String buscarFuncionario() {
		session = HibernateUtil.configureSessionFactory().openSession();
		funcionarioDAO = new FuncionarioDAO(session);
		List<Funcionario> lista = funcionarioDAO.pesquisarFuncionario(this
				.getKeyword());
		listaFuncionarios = new ListDataModel<Funcionario>(lista);
		this.keyword = null;
		return "/funcionarios/buscaFuncionario";
	}

	public String fazerLogIn() {
		session = HibernateUtil.configureSessionFactory().openSession();
		funcionarioDAO = new FuncionarioDAO(session);
		
		Criteria c = session.createCriteria(Funcionario.class);  
        Criterion _login = Restrictions.eq("login", this.login);  
        c.add(_login);  
        Criterion _senha = Restrictions.eq("senha", this.senha);  
        c.add(_senha);  
		
		boolean validated = false;
		if(c.uniqueResult() != null){
			funcionarioLogado = (Funcionario) c.uniqueResult();
			validated = true;
		}
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuariologado", validated);
		
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuario", getFuncionarioLogado());
		
		if (validated) {
			return "/home";
		} else {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Login ou senha incorretos!"));
			return "/login";
		}
	}
	
	public String logOut() {
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
		request.getSession().invalidate();
		return "/login";
	}
	
	public String getUsuarioLogado() {
		Funcionario func = (Funcionario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
		return func.getCargo();
	}

}
